home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Graphics / GraphicsWorkshop / Source / ControlLoader.m < prev    next >
Text File  |  1992-05-18  |  3KB  |  121 lines

  1. #import <stdio.h>
  2. #import <stdlib.h>
  3. #import <strings.h>
  4. #import <defaults.h>
  5. #import <sys/types.h>
  6. #import <sys/dir.h>
  7. #import <sys/param.h>
  8. #import <objc/objc-load.h>
  9. #import <appkit/Application.h>
  10. #import "ControlLoader.h"
  11.  
  12. @implementation ControlLoader
  13.  
  14.     id            controlObject;
  15.  
  16. - (char *)getImageControlFromPath: (char *)path ofType: (const char *)type
  17. {
  18.     DIR            *myDir;
  19.     struct direct    *myEntry;
  20.     static char    buffer[MAXPATHLEN];
  21.     char            typeBuffer[MAXPATHLEN];
  22.     
  23.     sprintf(typeBuffer, "%s.controls", type);
  24. #ifdef DEBUG
  25.     fprintf(stderr, "Opening %s to find %s\n", path, typeBuffer);
  26. #endif
  27.     myDir = opendir(path);
  28.     if (myDir) {
  29.         while (myEntry = readdir(myDir)) {
  30.             if (!strcmp(myEntry->d_name, typeBuffer)) {
  31.                 strcpy(buffer, path);
  32.                 strcat(buffer, myEntry->d_name);
  33. #ifdef DEBUG
  34.                 fprintf(stderr, "Found image tools: %s\n", buffer);
  35. #endif
  36.                 break;
  37.             }
  38.         }
  39.         closedir(myDir);
  40.     }
  41.     else {
  42. #ifdef DEBUG
  43.         fprintf(stderr, "Unable to open dir\n");
  44. #endif
  45.         return NULL;
  46.     }
  47.  
  48.     return buffer;
  49. }
  50.  
  51. - (char *)getImageControlsOfType: (const char *)type
  52. {
  53.     char        buffer[1000];
  54.     char        *imagePath = NULL;
  55.     char        *tmpPath;
  56.     
  57.     if (tmpPath=[self getImageControlFromPath: "/NextLibrary/Converters/" ofType: type]) {
  58.         imagePath = tmpPath;
  59.     }
  60.     if (tmpPath=[self getImageControlFromPath: "/LocalLibrary/Converters/" ofType: type]) {
  61.         imagePath = tmpPath;
  62.     }
  63.     sprintf(buffer, "%s/Library/Converters/", NXHomeDirectory());
  64.     if (tmpPath = [self getImageControlFromPath: buffer ofType: type]) {
  65.         imagePath = tmpPath;
  66.     }
  67.  
  68.     return imagePath;
  69. }
  70.  
  71. void LinkImageControlsCallBack(Class cl, Category ca)
  72. {
  73. #ifdef DEBUG
  74.     fprintf(stderr, "Call back for control object reached\n");
  75. #endif
  76.     controlObject = (id)cl;
  77. #ifdef DEBUG
  78.     fprintf(stderr, "Linked object at %p\n", cl);
  79. #endif
  80. }
  81.  
  82. + loadControl: (const char *)type
  83. {
  84.     NXStream    *myStream;
  85.     char            *cvtFiles[] = {    NULL,
  86.                                 NULL };
  87. /*    char            *cvtFiles[] = {    NULL,
  88.                                 "/usr/lib/libcs.a",
  89.                                 "/usr/lib/libm.a", 
  90.                                 "/usr/shlib/libNeXT_s.C.shlib",
  91.                                 "/usr/shlib/libsys_s.B.shlib",
  92.                                 NULL };
  93. */    
  94.     self = [super new];
  95.  
  96.     cvtFiles[0] = [self getImageControlsOfType: type];
  97.     if (!cvtFiles[0]) {
  98. #ifdef DEBUG
  99.         fprintf(stderr, "Fatal Error, unable to open controls type: %s\n", type);
  100. #endif
  101.         [self free];
  102.         return nil;
  103.     }
  104.     myStream = NXOpenFile(fileno(stderr), NX_WRITEONLY);
  105. #ifdef DEBUG
  106.     fprintf(stderr, "stderr linked to stream myStream\n");
  107. #endif
  108.     if (objc_loadModules(cvtFiles, myStream, LinkImageControlsCallBack, NULL, NULL)) {
  109.         NXFlush(myStream);
  110.         return nil;
  111.     }
  112.     NXFlush(myStream);
  113.     NXClose(myStream);
  114.  
  115.     [self free];
  116.     
  117.     return controlObject;
  118. }
  119.  
  120. @end
  121.